package com.relytosoft.mizar.analyze.handle.service.impl;

import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.relytosoft.mizar.analyze.base.entity.pojo.dto.AyDispositionPlanDto;
import com.relytosoft.mizar.analyze.base.entity.pojo.dto.controlPlan.PlanInfoDto;
import com.relytosoft.mizar.analyze.base.entity.pojo.dto.controlPlan.TimeSpanDto;
import com.relytosoft.mizar.analyze.base.enums.PlanTypeEnum;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;

import static com.relytosoft.mizar.analyze.handle.constant.ErrorConstants.JSON_PARSE_ERROR;

/**
 * @author wss
 * @version 1.0
 * @date 2022/5/25 17:10
 * @deprecated 华为布控模板验证逻辑 保留 前端目前不是此控件
 */
public class HwControlPlanServiceImpl {

    protected Logger log = LoggerFactory.getLogger(this.getClass());

    public static void main(String[] args) {
        String str = "[[{\"startTime\":1653382815000,\"endTime\":1653382830000,\"startTime1\":\"00:15\",\"endTime1\":\"00:30\"},{\"startTime\":1653382845000,\"endTime\":1653383130000,\"startTime1\":\"00:45\",\"endTime1\":\"05:30\"}],[{\"startTime\":1653382845000,\"endTime\":1653383220000,\"startTime1\":\"00:45\",\"endTime1\":\"07:00\"}],[{\"startTime\":null,\"endTime\":null,\"startTime1\":null,\"endTime1\":null}],[{\"startTime\":null,\"endTime\":null,\"startTime1\":null,\"endTime1\":null}],[{\"startTime\":null,\"endTime\":null,\"startTime1\":null,\"endTime1\":null}],[{\"startTime\":null,\"endTime\":null,\"startTime1\":null,\"endTime1\":null}],[{\"startTime\":null,\"endTime\":null,\"startTime1\":null,\"endTime1\":null}]]";
        List<List<TimeSpanDto>> lists = JSON.parseObject(str, new TypeReference<List<List<TimeSpanDto>>>() {
        });
        for (List<TimeSpanDto> list : lists) {
            System.out.println(list);
        }
    }

    /**
     * 布控模板验证
     *
     * @param ayDispositionPlanDto
     * @return
     */
    public Boolean controlPlanVerify(AyDispositionPlanDto ayDispositionPlanDto) {
        int planType = ayDispositionPlanDto.getPlanType();
        PlanTypeEnum planTypeEnum = PlanTypeEnum.getByValue(planType);
        //判断计划类型是否合法
        if (Objects.isNull(planTypeEnum)) {
            return false;
        }


        String planInfoList = ayDispositionPlanDto.getPlanInfoList();
        List<PlanInfoDto> planInfoDtoS;
        try {
            // JSON.parseObject(planInfoList)
            planInfoDtoS = JSON.parseArray(planInfoList, PlanInfoDto.class);
        } catch (Exception e) {
            log.error("{}--", JSON_PARSE_ERROR, e);
            return false;
        }


        switch (planTypeEnum) {
            case ALL_DAY_PLAN:
                return true;
            case WEEK_PLAN:
                return weekPlanVerify(planInfoDtoS);
            case DAY_PLAN:
                return dayPlanVerify(planInfoDtoS);
            default:
                return false;
        }
    }

    /**
     * 周计划验证
     *
     * @param planInfoDtoS
     * @return
     */
    public Boolean weekPlanVerify(List<PlanInfoDto> planInfoDtoS) {
        //周计划 至少一个计划信息对象
        if (planInfoDtoS.size() < 1) {
            log.info("{}--", JSON_PARSE_ERROR);
            return false;
        }
        Iterator<PlanInfoDto> planInfoDtoIterator = planInfoDtoS.iterator();
        while (planInfoDtoIterator.hasNext()) {
            PlanInfoDto planInfoDto = planInfoDtoIterator.next();
            int dayType = planInfoDto.getDayType();
            int dayOfWeek = DateUtil.dayOfWeek(DateUtil.date());
            //判断是否为这一天
            if (dayType != dayOfWeek) {
                continue;
            }
            //天计划验证
            Boolean dayPlanVerify = dayPlanVerify(Collections.singletonList(planInfoDto));
            if (dayPlanVerify) {
                return true;
            }
        }
        return false;
    }

    /**
     * 天计划验证
     *
     * @param planInfoDtoS
     * @return
     */
    public Boolean dayPlanVerify(List<PlanInfoDto> planInfoDtoS) {
        //天计划 最多一个计划信息对象
        if (planInfoDtoS.size() != 1) {
            log.info("{}--", JSON_PARSE_ERROR);
            return false;
        }
        PlanInfoDto planInfoDto = planInfoDtoS.get(0);
        List<TimeSpanDto> timeSpanInfoList = planInfoDto.getTimeSpanInfoList();
        //时间段信息对象最少有一个
        if (timeSpanInfoList.size() > 1) {
            return false;
        }
        return timeSpanVerify(timeSpanInfoList);
    }

    /**
     * 时间段验证
     *
     * @param timeSpanInfoList
     * @return
     */
    public Boolean timeSpanVerify(List<TimeSpanDto> timeSpanInfoList) {
        Iterator<TimeSpanDto> spanDtoIterator = timeSpanInfoList.iterator();
        while (spanDtoIterator.hasNext()) {
            TimeSpanDto spanDto = spanDtoIterator.next();
            Integer startTime = Integer.valueOf(spanDto.getStartTime());
            Integer endTime = Integer.valueOf(spanDto.getEndTime());
            Integer nowTime = Integer.valueOf(com.relytosoft.mizar.analyze.common.utils.DateUtil.toTimeStr(null));
            if (startTime < nowTime || endTime > nowTime) {
                return false;
            }
            return true;
        }
        return false;
    }

}
